package com.kolon.framework.file;

import java.io.File;
import java.io.IOException;

import org.springframework.web.multipart.MultipartFile;

import com.kolon.framework.file.iface.FileRenamePolicy;


/**
 *	업로드 된 파일 정보를 가지는 클래스
 *	@author Stone
 *	@since 2011.08.09
 */
public class FileUpload {
	/** 업로드완료된 파일의 정보를 담는 객체 */
	private UploadedFile uploadedFile = null;
	/** 파일이름 중복처리 클래스 */
	private FileRenamePolicy policy = null;
	
	/**
	 * 클래스 생성자
	 * @param file 				File 객체
	 * @param uploadFileName	파일의 실제 이름 List 객체
	 * @param saveDirectory 	파일 저장 디렉토리
	 * @param policy			파일이름 중복처리 클래스
	 * @throws IOException
	 */
	public FileUpload(MultipartFile file
					,String saveDirectory
					,FileRenamePolicy policy) 
			throws IOException {
		// 파일 존재
		if (file == null)
			throw new IllegalArgumentException("File list cannot be null");
		// 저장 디렉토리
		if (saveDirectory == null)
			throw new IllegalArgumentException("saveDirectory cannot be null");
		// 디렉토리 생성
		makeBasePath(saveDirectory);
		File dir = new File(saveDirectory);
		// 디렉토리 체크
		if (!dir.isDirectory())
			throw new IllegalArgumentException("Not a directory: " + saveDirectory);
		// 디렉토리 쓰기권한 체크
		if (!dir.canWrite())
			throw new IllegalArgumentException("Not writable: " + saveDirectory);
		// 파일 명 구현 클래스
		if (policy != null) {
			this.policy = policy;
		}
		// 파일 생성
		String fileRealName = file.getOriginalFilename();
		if (fileRealName != null && !"".equals(fileRealName)) {
			setUploadedFile(writeTo(file, dir, fileRealName));
		} else {
			setUploadedFile(new UploadedFile("", "", "", "", 0));
		}
	}
	
	/**
	 * 디렉토리 생성
	 * @param path 디렉토리 PATH
	 */
	private void makeBasePath(String path) {
		File dir = new File(path);
		if (!dir.exists()) dir.mkdirs();
	}
	
	/**
	 * 파일이름의 확장자 파싱
	 * @param fileName 파일명
	 * @return
	 */
	private String getExtension(String fileName) {
		if (fileName == null) return "";
		int dot = fileName.lastIndexOf(".");
		if (dot != -1 && fileName.length() > dot + 1) {
			return fileName.substring(dot+1);
		} else {
			return "";
		}
	}
	
	/**
	 * <pre>
	 * 	파일을 업로드 한 후 UploadedFile객체에 정보를 담아 리턴
	 * 	스프링 업로드
	 * </pre>
	 * @param inputFile 임시파일객체
	 * @param dir		저장 PATH
	 * @param fileRealName	저장될 파일이름
	 * @return uploadedFile 파일정보를 가지고 있는 객체
	 * @throws IOException
	 */
	private UploadedFile writeTo(MultipartFile inputFile, File dir, String fileRealName) throws IOException {
		UploadedFile uploadedFile = null;
		File file = new File(dir, fileRealName);
		try {
			if (this.policy != null) {
				file = this.policy.rename(file);
			}
			inputFile.transferTo(file);
			uploadedFile = new UploadedFile(file.getName()
				,dir.getAbsolutePath()
				,fileRealName
				,getExtension(fileRealName)
				,file.length());
		} finally {
		}
		return uploadedFile;
	}
	
	public void setUploadedFile(UploadedFile uploadedFile) {
		this.uploadedFile = uploadedFile;
	}

	public UploadedFile getUploadedFile() {
		return uploadedFile;
	}

}
